package thread.volatilepackage;

/**
 * Created by cuihao on 2018/2/25.
 */
public class RunC {
    public static void main(String[] args) {
        try {
            PrintStringC printStringService = new PrintStringC();
            new Thread(printStringService).start();
            Thread.sleep(3000);
            System.out.println("我要停止他 stopThread = " + Thread.currentThread().getName());
            printStringService.setContinuePrint(false);
        } catch (InterruptedException e) {
            e.printStackTrace();
        }
    }
}


/*
JVM设为 -server 服务时，还是会出现死循环，原因是在启动线程PrintStringC时，
变量 private boolean isContinuePrint = true 将会保存在公共堆和线程私有栈中，为了线程运行效率，会从私有堆栈中
获取isContinuePrint的值，但是更改的却是堆中的值，所以会一直是true也就陷入了死循环。
而使用volatile可以保证线程使用的是堆中的值。
这个问题的实质就是私有栈中的值和公共堆中的值不同造成的，使用volatile可以强制从公共堆栈中取值。

之前的理解有误，应该是先将内存的数据读到缓存中，然后再操作，如果用volatile修饰了变量，JVM会像cpu发送一条指令，将缓存的数据读到内存里去。
cpu的内部缓存和系统内存保持一致性
*/